Package de.yaams.extensions.basemap.tiled.mapeditor.actions

Source Code of de.yaams.extensions.basemap.tiled.mapeditor.actions.SaveAsImageAction

/*
* Tiled Map Editor, (c) 2008
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* Adam Turk <aturk@biggeruniverse.com> Bjorn Lindeijer <bjorn@lindeijer.nl>
*/

package de.yaams.extensions.basemap.tiled.mapeditor.actions;

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.filechooser.FileFilter;

import de.yaams.extensions.basemap.tiled.core.Map;
import de.yaams.extensions.basemap.tiled.mapeditor.MapEditor;
import de.yaams.extensions.basemap.tiled.mapeditor.Resources;
import de.yaams.extensions.basemap.tiled.mapeditor.util.ConfirmableFileFilter;
import de.yaams.extensions.basemap.tiled.mapeditor.util.ConfirmingFileChooser;
import de.yaams.extensions.basemap.tiled.view.MapView;
import de.yaams.maker.programm.YaFrame;

/**
* Saves the map to an image.
*
* @version $Id$
* @noinspection serial
*/
public class SaveAsImageAction extends AbstractAction {
  /**
   *
   */
  private static final long serialVersionUID = -5249081784874563180L;
  private final MapEditor editor;
  private final Frame appFrame;

  private static final String ACTION_NAME = Resources.getString("action.map.saveasimage.name");
  private static final String ACTION_TOOLTIP = Resources.getString("action.map.saveasimage.tooltip");
  private static final String DIALOG_TITLE = Resources.getString("dialog.saveasimage.title");

  public SaveAsImageAction(MapEditor editor) {
    super(ACTION_NAME);

    putValue(SHORT_DESCRIPTION, ACTION_TOOLTIP);
    putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("control shift I"));

    this.editor = editor;
    appFrame = YaFrame.get();
  }

  @Override
  public void actionPerformed(ActionEvent event) {
    if (editor.getCurrentMap() == null) {
      return;
    }

    JFileChooser chooser = new ConfirmingFileChooser();
    chooser.setDialogTitle(DIALOG_TITLE);
    final FileFilter defaultFilter = chooser.getFileFilter();

    final String[] names = ImageIO.getWriterFormatNames();
    for (String name : names) {
      if (name.matches("[A-Z].*")) {
        chooser.addChoosableFileFilter(new BasicFileFilter(name, name.toLowerCase()));
      }
    }

    // Make sure the "All Files" filter is selected by default
    chooser.setFileFilter(defaultFilter);

    if (chooser.showSaveDialog(appFrame) == JFileChooser.APPROVE_OPTION) {
      saveMapImage(chooser.getSelectedFile().getAbsolutePath());
    }
  }

  /**
   * Attempts to draw the entire map to an image file of the format of the
   * extension. (filename.ext)
   *
   * @param filename
   *            Image filename to save map render to.
   */
  private void saveMapImage(String filename) {
    final Map currentMap = editor.getCurrentMap();
    final MapView myView = MapView.createViewforMap(currentMap);
    myView.setMode(MapView.PF_NOSPECIAL, true);

    // Take grid and zoom level from the current map view
    final MapView mapView = editor.getMapView();
    myView.setShowGrid(mapView.getShowGrid());
    myView.setZoom(mapView.getZoom());

    final Dimension imgSize = myView.getPreferredSize();

    final int lastDot = filename.lastIndexOf('.');
    if (lastDot == -1) {
      JOptionPane.showMessageDialog(appFrame, "No file format specified.", "Error while saving map image", JOptionPane.ERROR_MESSAGE);
      return;
    }
    final String format = filename.substring(lastDot + 1);

    try {
      BufferedImage img = new BufferedImage(imgSize.width, imgSize.height, BufferedImage.TYPE_INT_RGB);
      Graphics2D g = img.createGraphics();
      g.setClip(0, 0, imgSize.width, imgSize.height);
      myView.paint(g);

      try {
        ImageIO.write(img, format, new File(filename));
      } catch (IOException e) {
        e.printStackTrace();
        JOptionPane.showMessageDialog(appFrame, "Error while saving " + filename + ": " + e.toString(),
            "Error while saving map image", JOptionPane.ERROR_MESSAGE);
      }
    } catch (OutOfMemoryError memoryError) {
      JOptionPane.showMessageDialog(appFrame, "Out of memory while creating image. Try increasing\n"
          + "your maximum heap size or zooming out a bit.", "Out of memory", JOptionPane.ERROR_MESSAGE);
    }
  }

  public class BasicFileFilter extends ConfirmableFileFilter {
    private final String extension;
    private final String description;

    public BasicFileFilter(String description, String extension) {
      this.description = description;
      this.extension = extension;
    }

    @Override
    public String getDefaultExtension() {
      return extension;
    }

    @Override
    public boolean accept(File file) {
      String fileName = file.getPath().toLowerCase();
      return file.isDirectory() || fileName.endsWith("." + extension);
    }

    @Override
    public String getDescription() {
      return description + " (*." + extension + ")";
    }
  }
}
TOP

Related Classes of de.yaams.extensions.basemap.tiled.mapeditor.actions.SaveAsImageAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.